/**
 * 寄生组合式继承
 * @description: 
 * 寄生组合继承是一种在JavaScript中实现继承的模式，它结合了原型链继承和寄生继承的优点，以解决两者各自的问题。这个模式的主要目的是避免在使用原型链继承时创建不必要的、多余的父类实例属性，同时允许函数复用。
在传统的原型链继承中，子类的原型会被设置为父类的一个实例。这意味着父类构造函数会被调用，创建了一些可能不需要的属性在子类的原型上。这样做的结果是，所有的子类实例都会继承这些不必要的属性。
寄生组合继承通过以下步骤来解决这个问题：
使用父类的原型创建一个空对象，作为子类的原型，这样就可以避免创建父类的实例属性。
修正子类原型的构造器指向，确保它指向子类而不是父类。
在子类的构造函数中调用父类的构造函数，这样子类的实例就可以拥有父类的实例属性。
 */

function inheritPrototype(subType, superType) {
  var prototype = Object.create(superType.prototype); // 创建对象 - 以父类原型创造对象原型
  prototype.constructor = subType;                    // 增强对象 - 原型上的构造函数指向子类
  subType.prototype = prototype;                      // 指定对象 - 子类的原型指向 创造好的原型
}

function SuperType(name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}

SuperType.prototype.sayName = function() {
  console.log(this.name);
};

function SubType(name, age) {
  SuperType.call(this, name);
  this.age = age;
}

inheritPrototype(SubType, SuperType);

SubType.prototype.sayAge = function() {
  console.log(this.age);
};

var instance = new SubType('Nicholas', 29);
instance.sayName(); // Nicholas
instance.sayAge(); // 29